package com.terry.test1.newd;

import com.terry.test1.org.SaleRep;
import com.terry.test1.org.SaleRepRepository;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotNull;

/**
 * dp 与 entity 的本质区别 是 entity有数据状态，而dp没有，dp可以组成entity
 *
 * 1.接口的清晰度 得到提升
 * 2.数据的验证和错误处理
 * 3.业务代码的清晰度
 * 4.可测试性
 *
 * 利用dp
 * 1> 将隐性的概念显性化  例如 String phone 封装成 PhoneNumber dp 对象
 * 2> 让隐性的上下文显性化  例如 BigDecimal money  封装成对象Money 包含money 和 currency 汇率
 * 3> 封装多对象的行为  例如 将转换汇率的功能 封装成 ExchangeRate 的  dp
 *
 * 利用dp重构代码时的步骤：
 * 1.创建dp,收集dp的所有行为
 * 2.替换数据校验 和无状态逻辑
 * 3.创建新接口
 * 4.修改外部调用
 */

@Validated
@Service
public class RegistrationServiceImpl implements RegistrationService {

    private SaleRepRepository saleRepRepository;
    private UserRepository userRepository;

    @Override
    public User register(@NotNull Name name, @NotNull PhoneNumber phone, @NotNull Address address) {
        SaleRep rep = saleRepRepository.findRep(phone.getAreaCode());
        //创建用户,落库
        User user = new User();
        user.setAdress(address);
        user.setName(name);
        user.setPhone(phone);
        if(rep != null){
            user.setRepId(rep.getRepId());
        }
        return userRepository.save(user);
    }
}
